Method-level security হল Spring Security-এর একটি বৈশিষ্ট্য যা আপনাকে নির্দিষ্ট মেথডের জন্য নিরাপত্তা কনফিগার করার সুবিধা দেয়। এর মাধ্যমে আপনি শুধুমাত্র নির্দিষ্ট রোল, পারমিশন বা শর্তের অধীনে একটি মেথড অ্যাক্সেস করার অনুমতি দিতে পারেন। এটি মূলত annotation-based security প্রয়োগে ব্যবহৃত হয় এবং খুবই কার্যকরী যখন আপনি fine-grained control চান যে কোন ব্যবহারকারী বা রোল কোন ফিচার অ্যাক্সেস করতে পারবে।
Spring Security-তে method-level security কে প্রাথমিকভাবে দুইটি মূল উপায়ে ব্যবহার করা হয়:
- Authorization (অথরাইজেশন) – কোন ব্যবহারকারী বা রোল কে কোন মেথড অ্যাক্সেস করতে পারবে তা নির্ধারণ করা।
- Authentication (প্রমাণীকরণ) – কোন ব্যবহারকারী সিস্টেমে লগ ইন করেছেন এবং তাদের শংসাপত্র যাচাই করা।
Spring Security Method-Level Security-এর প্রধান ধরনের Annotation
@PreAuthorize@PreAuthorizeannotation ব্যবহার করে মেথডের আগে authorization চেক করা হয়। এটিSpEL (Spring Expression Language)ব্যবহার করে condition নির্ধারণ করতে পারে।
@Secured@Securedannotation শুধু নির্দিষ্ট রোল বা পারমিশন মেনে মেথড অ্যাক্সেস করতে অনুমতি দেয়। তবে এটিSpELএর চেয়ে কম ফ্লেক্সিবল।
@PostAuthorize@PostAuthorizeannotation ব্যবহার করে মেথডের পর authorization চেক করা হয়। এটি মূলত মেথডের আউটপুট পর্যালোচনা করার জন্য ব্যবহৃত হয়।
@RolesAllowed@RolesAllowedannotation Java EE এর একটি অংশ এবং এটি সেভাবে Spring Security এর মাধ্যমে কাজ করে। তবে এটি@Securedএর মতো রোল চেক করতে ব্যবহৃত হয়।
Method-Level Security সক্রিয় করা
1. Method-level security সক্রিয় করা
Spring Security-তে method-level security ব্যবহারের জন্য @EnableGlobalMethodSecurity annotation যোগ করতে হয়। এটি আপনার Spring Security configuration ক্লাসে থাকতে হবে।
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig {
// Configuration for method-level security
}
prePostEnabled = true: এটি@PreAuthorizeএবং@PostAuthorizeব্যবহার করতে সক্ষম করবে।securedEnabled = true: এটি@Securedannotation এর ব্যবহার সক্ষম করবে।
Method-Level Security Example
1. @PreAuthorize ব্যবহার
@PreAuthorize ব্যবহার করে মেথডের আগে condition চেক করা হয়। এখানে আমরা SpEL ব্যবহার করছি যা রোল বা পারমিশনের উপর ভিত্তি করে মেথড অ্যাক্সেস নিয়ন্ত্রণ করবে।
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;
@Service
public class ProductService {
@PreAuthorize("hasRole('ADMIN')")
public void createProduct() {
System.out.println("Product created!");
}
@PreAuthorize("hasRole('USER') or hasRole('ADMIN')")
public void viewProduct() {
System.out.println("Product viewed!");
}
@PreAuthorize("hasPermission(#productId, 'Product', 'READ')")
public void viewProductDetails(Long productId) {
System.out.println("Product details viewed for productId: " + productId);
}
}
@PreAuthorize("hasRole('ADMIN')"): শুধুমাত্র ADMIN রোলের ব্যবহারকারীরাcreateProduct()মেথডটি অ্যাক্সেস করতে পারবেন।@PreAuthorize("hasRole('USER') or hasRole('ADMIN')"): USER বা ADMIN রোলের ব্যবহারকারীviewProduct()মেথডটি অ্যাক্সেস করতে পারবেন।@PreAuthorize("hasPermission(#productId, 'Product', 'READ')"): এই method-এhasPermissionব্যবহার করে permission ভিত্তিক অ্যাক্সেস নিয়ন্ত্রণ করা হয়েছে।
2. @Secured ব্যবহার
@Secured একটি নির্দিষ্ট রোল বা permission ভিত্তিক অ্যাক্সেস নিয়ন্ত্রণ করতে ব্যবহৃত হয়। এটি খুবই সরল এবং SpEL এর চেয়ে কম ফ্লেক্সিবল।
import org.springframework.security.access.annotation.Secured;
import org.springframework.stereotype.Service;
@Service
public class ProductService {
@Secured("ROLE_ADMIN")
public void createProduct() {
System.out.println("Product created!");
}
@Secured({"ROLE_USER", "ROLE_ADMIN"})
public void viewProduct() {
System.out.println("Product viewed!");
}
}
@Secured("ROLE_ADMIN"): শুধুমাত্র ROLE_ADMIN ব্যবহারকারীcreateProduct()মেথড অ্যাক্সেস করতে পারবেন।@Secured({"ROLE_USER", "ROLE_ADMIN"}): ROLE_USER বা ROLE_ADMIN ব্যবহারকারীviewProduct()মেথড অ্যাক্সেস করতে পারবেন।
3. @PostAuthorize ব্যবহার
@PostAuthorize annotation মেথডের পরে ব্যবহার করা হয়। এটি মেথডের আউটপুট যাচাই করার জন্য ব্যবহৃত হয়।
import org.springframework.security.access.prepost.PostAuthorize;
import org.springframework.stereotype.Service;
@Service
public class ProductService {
@PostAuthorize("returnObject.owner == authentication.name")
public Product getProduct(Long productId) {
return productRepository.findById(productId).orElse(null);
}
}
@PostAuthorize("returnObject.owner == authentication.name"): এটি চেক করে যেProductঅবজেক্টটিরownerবর্তমানে লগ ইন করা ব্যবহারকারীর নামের সাথে মেলাচ্ছে কি না।
৪. @RolesAllowed ব্যবহার
@RolesAllowed Java EE-এর একটি annotation এবং Spring Security-এও এটি ব্যবহৃত হয়। এটি শুধুমাত্র নির্দিষ্ট রোলগুলির জন্য মেথড অ্যাক্সেস প্রদান করে।
import javax.annotation.security.RolesAllowed;
import org.springframework.stereotype.Service;
@Service
public class ProductService {
@RolesAllowed("ADMIN")
public void createProduct() {
System.out.println("Product created!");
}
@RolesAllowed({"USER", "ADMIN"})
public void viewProduct() {
System.out.println("Product viewed!");
}
}
@RolesAllowed("ADMIN"): শুধুমাত্র ADMIN রোলের ব্যবহারকারীcreateProduct()মেথডটি অ্যাক্সেস করতে পারবেন।
Conclusion
Spring Security-তে method-level security ব্যবহারের মাধ্যমে আপনি নির্দিষ্ট মেথডের জন্য নিরাপত্তা নিয়ন্ত্রণ করতে পারেন। এটি fine-grained access control প্রদান করে, যেখানে আপনি নির্দিষ্ট রোল, পারমিশন বা শর্তের উপর ভিত্তি করে মেথড অ্যাক্সেস নিয়ন্ত্রণ করতে পারেন। Spring Security-তে বিভিন্ন ধরনের annotations (যেমন @PreAuthorize, @Secured, @PostAuthorize, @RolesAllowed) ব্যবহার করে মেথড-ভিত্তিক নিরাপত্তা কনফিগার করা যায়।
Read more